# **************************************
# --*-- coding: utf-8 --*--
# @Author  : white
# @FileName: main.py
# @Time    : 2025-09-04
# **************************************
import numpy as np  # 导入numpy库，用于数值计算

# 生成两个类别的合成数据
# 类别0：围绕点(0,0)生成样本，类别1：围绕点(2,2)生成样本
# 每个类别100个样本，使用高斯噪声
np.random.seed(42)  # 设置随机种子，确保结果可复现
num_samples = 100  # 每个类别的样本数

# 生成类别0的数据：X0为二维特征，均值为[0,0]，协方差为单位矩阵
X0 = np.random.randn(num_samples, 2) + np.array([0, 0])
y0 = np.zeros(num_samples)  # 类别0的标签为0

# 生成类别1的数据：X1为二维特征，均值为[2,2]，协方差为单位矩阵
X1 = np.random.randn(num_samples, 2) + np.array([2, 2])
y1 = np.ones(num_samples)  # 类别1的标签为1

# 合并数据：X为所有特征，y为所有标签
X = np.vstack((X0, X1))  # 垂直堆叠X0和X1
y = np.hstack((y0, y1))  # 水平堆叠y0和y1

# 添加偏置项：在X的左侧添加一列全1，用于截距
X = np.column_stack((np.ones(X.shape[0]), X))  # 形状变为(200, 3)

# 初始化参数：w为权重向量，包括偏置，形状(3,)
w = np.random.randn(X.shape[1])  # 随机初始化权重

# 设置超参数
learning_rate = 0.01  # 学习率
num_iterations = 1000  # 迭代次数

# 梯度下降优化
for i in range(num_iterations):
    # 计算预测值：线性模型 y_pred = X * w
    y_pred = np.dot(X, w)

    # 计算均方误差损失（MSE），但由于是分类，我们用它来拟合0/1标签
    # 梯度：dw = (1/n) * X^T * (y_pred - y)
    dw = (1 / X.shape[0]) * np.dot(X.T, (y_pred - y))

    # 更新权重：w = w - learning_rate * dw
    w -= learning_rate * dw

# 输出最终权重
print("最终权重（包括偏置）:", w)

# 测试预测：对于新点[1,1]，添加偏置后预测
new_point = np.array([1, 1, 1])  # 注意顺序：偏置, x1, x2
prediction = np.dot(new_point, w)
print("对点(1,1)的预测值:", prediction)
print("分类建议：如果预测 > 0.5，则类别1，否则类别0")
